package basics

import "fmt"

// Functions 函数
// Go语言中的函数不需要先声明在使用
func Functions() {

	sayHello()
	sayHelloToSomeOne("gaox")
	_sumOneAndOne := sumOneAndOne()
	fmt.Printf("sumOneAndOne result = %d\n", _sumOneAndOne)
	_sum := sum(6, 1)
	fmt.Printf("sum result = %d\n", _sum)
	_sumWithSpecifyReturnValue := sumWithSpecifyReturnValue()
	fmt.Printf("sumWithSpecifyReturnValue result = %d\n", _sumWithSpecifyReturnValue)
	_calculateSum, _calculateSub := calculate(6, 1)
	fmt.Printf("calculate result sum= %d, sub=%d\n", _calculateSum, _calculateSub)
	_calculateAdjacentSameTypeSum, _calculateAdjacentSameTypeSub := calculateAdjacentSameType(6, 1)
	fmt.Printf("calculateAdjacentSameType result sum= %d, sub=%d\n", _calculateAdjacentSameTypeSum, _calculateAdjacentSameTypeSub)

}

// 无参数无返回值函数
func sayHello() {
	fmt.Println("Hello World!!!")
}

// 有参数无返回值函数
func sayHelloToSomeOne(name string) {
	fmt.Println("Hello ", name)
}

// 无参数有返回值函数
// 只有一个返回值时,返回值列表的()可以省略
func sumOneAndOne() int {
	return 1 + 1
}

// 有参数有返回值函数
func sum(a int, b int) int {
	return a + b
}

// 给返回值指定了一个名称叫做res，return时会自动将函数体内部res作为返回值
// 其实本质就是提前定义了一个局部变量res，在函数体中使用的res就是这个局部变量,返回的也是这个局部变量
func sumWithSpecifyReturnValue() (res int) {
	res = 1 + 1
	return
}

// 函数允许有多个返回值函数
func calculate(a int, b int) (sum int, sub int) {
	sum = a + b
	sub = a - b
	return
}

// 相邻同类型形参OR返回值类型可以合并，可以将数据类型写到最后一个同类型形参OR返回值后面
// a，b都是int类型，所以只需要在b后面添加int即可
func calculateAdjacentSameType(a, b int) (sum, sub int) {
	sum = a + b
	sub = a - b
	return
}
